package com.ruoyi.level.service;

import java.util.List;
import com.ruoyi.level.domain.PointsLevelRule;

/**
 * 用户积分等级规则Service接口
 * 
 * @author 区嘉盛
 * @date 2025-06-16
 */
public interface IPointsLevelRuleService 
{
    /**
     * 查询用户积分等级规则
     * 
     * @param id 用户积分等级规则主键
     * @return 用户积分等级规则
     */
    public PointsLevelRule selectPointsLevelRuleById(Long id);

    /**
     * 查询用户积分等级规则列表
     * 
     * @param pointsLevelRule 用户积分等级规则
     * @return 用户积分等级规则集合
     */
    public List<PointsLevelRule> selectPointsLevelRuleList(PointsLevelRule pointsLevelRule);

    /**
     * 新增用户积分等级规则
     * 
     * @param pointsLevelRule 用户积分等级规则
     * @return 结果
     */
    public int insertPointsLevelRule(PointsLevelRule pointsLevelRule);

    /**
     * 修改用户积分等级规则
     * 
     * @param pointsLevelRule 用户积分等级规则
     * @return 结果
     */
    public int updatePointsLevelRule(PointsLevelRule pointsLevelRule);

    /**
     * 批量停用用户积分等级规则
     *
     * @param ids 需要停用的用户积分等级规则主键集合
     * @return 结果
     */
    public int disablePointsLevelRuleByIds(Long[] ids);

    /**
     * 停用用户积分等级规则信息
     *
     * @param id 用户积分等级规则主键
     * @return 结果
     */
    public int disablePointsLevelRuleById(Long id);

    /**
     * 批量启用用户积分等级规则
     *
     * @param ids 需要启用的用户积分等级规则主键集合
     * @return 结果
     */
    public int enablePointsLevelRuleByIds(Long[] ids);

    /**
     * 启用用户积分等级规则信息
     *
     * @param id 用户积分等级规则主键
     * @return 结果
     */
    public int enablePointsLevelRuleById(Long id);

    /**
     * 检查指定等级体系下是否存在相同排序号
     * 
     * @param systemName 等级体系名称
     * @param sortOrder 排序号
     * @return 是否存在
     */
    public boolean checkSortOrderExists(String systemName, Long sortOrder);

    /**
     * 检查指定等级体系下是否存在相同等级名称
     * 
     * @param systemName 等级体系名称
     * @param levelName 等级名称
     * @return 是否存在
     */
    public boolean checkLevelNameExists(String systemName, String levelName);
    
    /**
     * 检查指定等级体系下是否存在相同排序号（排除指定ID的记录）
     * 
     * @param systemName 等级体系名称
     * @param sortOrder 排序号
     * @param excludeId 要排除的记录ID
     * @return 是否存在
     */
    public boolean checkSortOrderExistsExcludeId(String systemName, Long sortOrder, Long excludeId);

    /**
     * 检查指定等级体系下是否存在相同等级名称（排除指定ID的记录）
     * 
     * @param systemName 等级体系名称
     * @param levelName 等级名称
     * @param excludeId 要排除的记录ID
     * @return 是否存在
     */
    public boolean checkLevelNameExistsExcludeId(String systemName, String levelName, Long excludeId);

    /**
     * 检查是否是最高等级（排序号最大的等级）
     *
     * @param systemName 等级体系名称
     * @param sortOrder 当前等级的排序号
     * @return 是否是最高等级
     */
    public boolean isHighestLevel(String systemName, Long sortOrder);

    /**
     * 检查等级体系中是否已存在无上限的等级
     *
     * @param systemName 等级体系名称
     * @param excludeId 要排除的记录ID（修改时使用）
     * @return 是否存在无上限等级
     */
    public boolean hasUnlimitedLevel(String systemName, Long excludeId);

    /**
     * 检查等级规则的积分范围是否符合规则
     * 1. 最低积分不得小于0
     * 2. 最高积分必须大于最低积分
     * 3. 排序号大的等级的最低积分要大于排序号小的等级的最高积分
     * 4. 排序号小的等级的最高积分要小于排序号大的等级的最低积分
     *
     * @param systemName 等级体系名称
     * @param sortOrder 排序号
     * @param minPoints 最低积分
     * @param maxPoints 最高积分
     * @return 校验结果消息，如果为null则表示校验通过
     */
    public String checkPointsRangeValid(String systemName, Long sortOrder, Long minPoints, Long maxPoints);

    /**
     * 获取所有不同的等级体系名称
     *
     * @return 等级体系名称列表
     */
    public List<String> selectAllSystemNames();
}
